#!/bin/bash
# This script runs 'buildtest' on each of several distros
# via Docker.
set -o pipefail

exec 3>&1 4>&2
die() { echo "$*" >&4; exit 1; }

[ -e "ShellCheck.cabal" ] || die "ShellCheck.cabal not in this dir"

[ "$1" = "--run" ] || {
cat << EOF
This script pulls multiple distros via Docker and compiles
ShellCheck and dependencies for each one. It takes hours,
and is still highly experimental.

Make sure you're plugged in and have screen/tmux in place,
then re-run with $0 --run to continue.

Also note that dist* will be deleted.
EOF
exit 0
}

echo "Deleting 'dist' and 'dist-newstyle'..."
rm -rf dist dist-newstyle

execs=$(find . -name shellcheck)

if [ -n "$execs" ]
then
  die "Found unexpected executables. Remove and try again: $execs"
fi

log=$(mktemp) || die "Can't create temp file"
date >> "$log" || die "Can't write to log"

echo "Logging to $log" >&3
exec >> "$log" 2>&1

final=0
while read -r distro setup
do
  [[ "$distro" = "#"* || -z "$distro" ]] && continue
  printf '%s ' "$distro" >&3
  docker pull "$distro" || die "Can't pull $distro"
  printf 'pulled. ' >&3

  tmp=$(mktemp -d) || die "Can't make temp dir"
  cp -r . "$tmp/" || die "Can't populate test dir"
  printf 'Result: ' >&3
  < /dev/null docker run -v "$tmp:/mnt" "$distro" sh -c "
    $setup
    cd /mnt || exit 1
    test/buildtest
    "
  ret=$?
  if [ "$ret" = 0 ]
  then
    echo "OK" >&3
  else
    echo "FAIL with $ret. See $log" >&3
    final=1
  fi
  rm -rf "$tmp"
done << EOF
# Docker tag          Setup command
debian:stable         apt-get update && apt-get install -y cabal-install
debian:testing        apt-get update && apt-get install -y cabal-install
ubuntu:latest         apt-get update && apt-get install -y cabal-install
haskell:latest        true
opensuse/leap:latest  zypper install -y cabal-install ghc
fedora:latest         dnf install -y cabal-install ghc-template-haskell-devel findutils libstdc++-static gcc-c++
archlinux:latest      pacman -S -y --noconfirm cabal-install ghc-static base-devel

# Ubuntu LTS
ubuntu:22.04          apt-get update && apt-get install -y cabal-install
ubuntu:20.04          apt-get update && apt-get install -y cabal-install

# Stack on Ubuntu LTS
ubuntu:22.04          set -e; apt-get update && apt-get install -y curl && curl -sSL https://get.haskellstack.org/ | sh -s - -f && cd /mnt && exec test/stacktest
EOF

exit "$final"
